/*
题目: 岛屿数量
给你一个由 '1'（陆地）和 '0'（水）组成的的二维网格，请你计算网格中岛屿的数量。

岛屿总是被水包围，并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外，你可以假设该网格的四条边均被水包围。
https://leetcode.cn/problems/number-of-islands/
 */
public class NumIslands {
    boolean[][] visited = null;
    int[][] dir = new int[][] {{1,0},{-1,0},{0,1},{0,-1}};
    int row, col;
    int src = 0;

    public int numIslands(char[][] grid) {
        row = grid.length;
        col = grid[0].length;
        visited  = new boolean[row][col];

        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (!visited[i][j] && grid[i][j] == '1') {
                    dfs(grid, i, j);
                    src ++;
                }
            }
        }

        return src;
    }

    private void dfs(char[][] grid, int x, int y) {
        visited[x][y] = true;

        for (int i = 0; i < 4; i++) {
            int nextX = x + dir[i][0];
            int nextY = y + dir[i][1];

            if (nextX < 0 || nextX >= row || nextY < 0 || nextY >= col) {
                continue ;
            }

            if (!visited[nextX][nextY] && grid[nextX][nextY] == '1') {
                dfs(grid, nextX, nextY);
            }
        }
    }
}
